package com.woniuxy.mq01.consumer;

import com.rabbitmq.client.Channel;
import com.woniuxy.mq01.entity.Student;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * @Author author
 * @Create 2023-09-28 11:39
 */
@Component
public class MyConsumer {

    //这个注解就是让这个方法监听指定的队列，接收消息，处理消息
    //String str,   消息体，可以写Object
    // Message message, 完整的消息对象,保护其他信息
    // Channel channel,信道对象
    @RabbitListener(queues="queuehellworld")
    public void receivequeuehellworld(String str, Message message, Channel channel){
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("接收queuehelloworld队列消息，处理消息");
        System.out.println("str="+str);
        System.out.println("message="+message);
        System.out.println("channel="+channel);
    }
    @RabbitListener(queues="queueemail")
    public void receiveQueueEmail(Student student, Message message, Channel channel) throws IOException {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("接收email队列消息，处理消息，发送邮件");
        System.out.println("str="+student);
        System.out.println("message="+message);
        System.out.println("channel="+channel);
        //成功确认
//        long deliveryTag,    投递标记，处理消息的唯一标志
//        boolean multiple      true,同时处理小于当前tag的所有消息，一般用false,消费一个确认一个
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
//        try {
//            if(true){
//                throw new RuntimeException("email队列处理消息异常");
//            }
//        } catch (RuntimeException e) {
//            //告诉服务器处理失败
//            //long deliveryTag, boolean multiple, boolean requeue是否重回队列
//            //失败，重回队列
////            channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true);
//            //失败，不重回队列。使用其他逻辑处理
//            channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,false);
//            System.out.println("处理异常：原理的消费方案不能正常处理，使用其他方式，记录日志，记录数据库中，人工处理");
//        }

//        try {
//            if(true){
//                throw new RuntimeException("email队列处理消息异常");
//            }
//        } catch (RuntimeException e) {
//            e.printStackTrace();
//            System.out.println("处理异常：原理的消费方案不能正常处理，使用其他方式，记录日志，记录数据库中，人工处理");
//        }
    }
    @RabbitListener(queues="queuesms")
    public void receiveQueueSms(String str, Message message, Channel channel){
        System.out.println("接收sms队列消息，处理消息，发送短信");
        System.out.println("str="+str);
        System.out.println("message="+message);
        System.out.println("channel="+channel);
    }
}
